package com.beantools.execption;

import com.beantools.constants.SingleChar;

import java.io.Serializable;

import static com.beantools.constants.SingleChar.BLANK_OP;
import static com.beantools.util.ObjectUtil.isNotNull;

/**
 * 该类是处理与java对象包相关的异常，其继承{@code RuntimeException}.
 *
 * @author baoya
 * @since 1.1.0
 */

public class PackageException extends RuntimeException implements Serializable {

    private static final long serialVersionUID = 3584443319479537885L;

    /**
     * 包名
     */
    private String packageName;

    /**
     * 抛出的异常信息，包找不到
     */
    private String message;

    /**
     * @param packageName 包名称
     */
    public PackageException(String packageName) {
        this.packageName = packageName;
    }

    /**
     * @param message     抛出的异常信息
     * @param packageName 包名称
     * @since 1.1.0
     */
    public PackageException(String packageName, String message) {
        super(message);
        this.message = message;
        this.packageName = packageName;
    }

    /**
     * 重写父类的方getMessage()法，返回自定义的错误信息。首先，属性名不能为空
     * 否则，就抛出空指针异常。如果当前类的类字面常量不为空，则抛出了异常，比如：
     * <small>
     * "类com.beantools.Test的属性名为aName的第二个字母不能大写
     * </small>
     * 如果调用者没有写当前类字面常量，其就会这样报出错误信息
     * <small>
     * "属性名为aName的第二个字母不能大写
     * </small>
     *
     * @return message 错误信息
     */
    @Override
    public String getMessage() {
        return (isNotNull(packageName) ? ( packageName ) : SingleChar.NULL_OP) +
                "的异常信息" + SingleChar.SIGN_COLON_OP + BLANK_OP + this.message;
    }
}
